/**
 * 成就和排行榜系统端到端测试
 * 测试成就解锁、进度跟踪和排行榜功能
 */
describe('成就和排行榜系统测试', () => {
  beforeEach(() => {
    cy.visit('/')
    // 清除之前的成就数据
    cy.window().then((win) => {
      win.localStorage.removeItem('achievements')
      win.localStorage.removeItem('leaderboard')
    })
  })

  describe('成就系统测试', () => {
    beforeEach(() => {
      // 打开成就面板
      cy.get('[data-cy="achievements-btn"]').click()
    })

    it('应该显示成就面板', () => {
      // 验证成就面板显示
      cy.get('[data-cy="achievements-panel"]').should('be.visible')
      cy.get('[data-cy="achievements-title"]').should('contain', '成就')
      
      // 验证成就列表
      cy.get('[data-cy="achievements-list"]').should('be.visible')
      cy.get('[data-cy="achievement-item"]').should('have.length.at.least', 1)
    })

    it('应该显示成就详情', () => {
      // 点击成就项
      cy.get('[data-cy="achievement-item"]').first().click()
      
      // 验证成就详情
      cy.get('[data-cy="achievement-details"]').should('be.visible')
      cy.get('[data-cy="achievement-name"]').should('be.visible')
      cy.get('[data-cy="achievement-description"]').should('be.visible')
      cy.get('[data-cy="achievement-progress"]').should('be.visible')
      cy.get('[data-cy="achievement-reward"]').should('be.visible')
    })

    it('应该跟踪成就进度', () => {
      // 关闭成就面板，开始游戏
      cy.get('[data-cy="close-achievements-btn"]').click()
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 执行跳跃（触发"首次跳跃"成就）
      cy.gameAction('jump')
      
      // 检查成就通知
      cy.get('[data-cy="achievement-notification"]').should('be.visible')
      cy.get('[data-cy="achievement-notification"]').should('contain', '首次跳跃')
      
      // 打开成就面板验证
      cy.get('body').type('{esc}')
      cy.get('[data-cy="achievements-btn"]').click()
      cy.get('[data-cy="achievement-first-jump"]').should('have.class', 'unlocked')
    })

    it('应该解锁基于分数的成就', () => {
      // 开始游戏
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 模拟达到特定分数
      cy.window().then((win) => {
        win.gameStore.score = 100
        win.dispatchEvent(new CustomEvent('score-updated', { detail: { score: 100 } }))
      })
      
      // 验证分数成就解锁
      cy.get('[data-cy="achievement-notification"]').should('contain', '百分达人')
    })

    it('应该解锁基于距离的成就', () => {
      // 开始游戏
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 模拟跑过特定距离
      cy.window().then((win) => {
        win.gameStore.distance = 1000
        win.dispatchEvent(new CustomEvent('distance-updated', { detail: { distance: 1000 } }))
      })
      
      // 验证距离成就解锁
      cy.get('[data-cy="achievement-notification"]').should('contain', '千米跑者')
    })

    it('应该解锁连击成就', () => {
      // 开始游戏
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 执行连续动作
      for (let i = 0; i < 10; i++) {
        cy.gameAction('jump')
        cy.wait(100)
      }
      
      // 验证连击成就
      cy.get('[data-cy="achievement-notification"]').should('contain', '连击高手')
    })

    it('应该显示成就统计', () => {
      // 解锁一些成就
      cy.window().then((win) => {
        const achievements = [
          { id: 'first-jump', unlocked: true, unlockedAt: Date.now() },
          { id: 'score-100', unlocked: true, unlockedAt: Date.now() - 86400000 }
        ]
        win.localStorage.setItem('achievements', JSON.stringify(achievements))
      })
      
      cy.reload()
      cy.get('[data-cy="achievements-btn"]').click()
      
      // 验证统计信息
      cy.get('[data-cy="achievements-stats"]').should('be.visible')
      cy.get('[data-cy="unlocked-count"]').should('contain', '2')
      cy.get('[data-cy="total-count"]').should('be.visible')
      cy.get('[data-cy="completion-percentage"]').should('be.visible')
    })

    it('应该按类别筛选成就', () => {
      // 选择不同类别
      cy.get('[data-cy="achievement-category-gameplay"]').click()
      cy.get('[data-cy="achievement-item"][data-category="gameplay"]').should('be.visible')
      cy.get('[data-cy="achievement-item"]:not([data-category="gameplay"])').should('not.be.visible')
      
      cy.get('[data-cy="achievement-category-score"]').click()
      cy.get('[data-cy="achievement-item"][data-category="score"]').should('be.visible')
      cy.get('[data-cy="achievement-item"]:not([data-category="score"])').should('not.be.visible')
    })
  })

  describe('排行榜系统测试', () => {
    beforeEach(() => {
      // 打开排行榜
      cy.get('[data-cy="leaderboard-btn"]').click()
    })

    it('应该显示排行榜面板', () => {
      // 验证排行榜显示
      cy.get('[data-cy="leaderboard-panel"]').should('be.visible')
      cy.get('[data-cy="leaderboard-title"]').should('contain', '排行榜')
      
      // 验证排行榜列表
      cy.get('[data-cy="leaderboard-list"]').should('be.visible')
    })

    it('应该记录和显示最高分', () => {
      // 关闭排行榜，开始游戏
      cy.get('[data-cy="close-leaderboard-btn"]').click()
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 模拟获得高分
      cy.window().then((win) => {
        win.gameStore.score = 500
      })
      
      // 结束游戏
      cy.window().then((win) => {
        win.dispatchEvent(new CustomEvent('game-over'))
      })
      
      // 验证分数记录
      cy.get('[data-cy="game-over-screen"]').should('be.visible')
      cy.get('[data-cy="new-high-score"]').should('be.visible')
      
      // 打开排行榜验证
      cy.get('[data-cy="leaderboard-btn"]').click()
      cy.get('[data-cy="leaderboard-entry"]').first().should('contain', '500')
    })

    it('应该按分数排序', () => {
      // 添加测试数据
      cy.window().then((win) => {
        const scores = [
          { score: 1000, date: Date.now(), character: 'default' },
          { score: 750, date: Date.now() - 86400000, character: 'speedster' },
          { score: 500, date: Date.now() - 172800000, character: 'default' }
        ]
        win.localStorage.setItem('leaderboard', JSON.stringify(scores))
      })
      
      cy.reload()
      cy.get('[data-cy="leaderboard-btn"]').click()
      
      // 验证排序
      cy.get('[data-cy="leaderboard-entry"]').first().should('contain', '1000')
      cy.get('[data-cy="leaderboard-entry"]').eq(1).should('contain', '750')
      cy.get('[data-cy="leaderboard-entry"]').eq(2).should('contain', '500')
    })

    it('应该显示排行榜详细信息', () => {
      // 添加测试数据
      cy.window().then((win) => {
        const scores = [
          { 
            score: 1000, 
            date: Date.now(), 
            character: 'default',
            distance: 2000,
            time: 120000
          }
        ]
        win.localStorage.setItem('leaderboard', JSON.stringify(scores))
      })
      
      cy.reload()
      cy.get('[data-cy="leaderboard-btn"]').click()
      
      // 点击排行榜条目
      cy.get('[data-cy="leaderboard-entry"]').first().click()
      
      // 验证详细信息
      cy.get('[data-cy="score-details"]').should('be.visible')
      cy.get('[data-cy="score-value"]').should('contain', '1000')
      cy.get('[data-cy="distance-value"]').should('contain', '2000')
      cy.get('[data-cy="time-value"]').should('be.visible')
      cy.get('[data-cy="character-used"]').should('contain', 'default')
    })

    it('应该支持不同时间段筛选', () => {
      // 添加不同时间的分数
      cy.window().then((win) => {
        const now = Date.now()
        const scores = [
          { score: 1000, date: now, character: 'default' }, // 今天
          { score: 800, date: now - 86400000, character: 'default' }, // 昨天
          { score: 600, date: now - 604800000, character: 'default' } // 一周前
        ]
        win.localStorage.setItem('leaderboard', JSON.stringify(scores))
      })
      
      cy.reload()
      cy.get('[data-cy="leaderboard-btn"]').click()
      
      // 筛选今日最佳
      cy.get('[data-cy="filter-today"]').click()
      cy.get('[data-cy="leaderboard-entry"]').should('have.length', 1)
      cy.get('[data-cy="leaderboard-entry"]').first().should('contain', '1000')
      
      // 筛选本周最佳
      cy.get('[data-cy="filter-week"]').click()
      cy.get('[data-cy="leaderboard-entry"]').should('have.length', 2)
      
      // 筛选全部时间
      cy.get('[data-cy="filter-all"]').click()
      cy.get('[data-cy="leaderboard-entry"]').should('have.length', 3)
    })

    it('应该限制排行榜条目数量', () => {
      // 添加大量分数数据
      cy.window().then((win) => {
        const scores = []
        for (let i = 0; i < 15; i++) {
          scores.push({
            score: 1000 - i * 50,
            date: Date.now() - i * 3600000,
            character: 'default'
          })
        }
        win.localStorage.setItem('leaderboard', JSON.stringify(scores))
      })
      
      cy.reload()
      cy.get('[data-cy="leaderboard-btn"]').click()
      
      // 验证只显示前10名
      cy.get('[data-cy="leaderboard-entry"]').should('have.length', 10)
    })

    it('应该支持清除排行榜', () => {
      // 添加测试数据
      cy.window().then((win) => {
        const scores = [{ score: 1000, date: Date.now(), character: 'default' }]
        win.localStorage.setItem('leaderboard', JSON.stringify(scores))
      })
      
      cy.reload()
      cy.get('[data-cy="leaderboard-btn"]').click()
      
      // 清除排行榜
      cy.get('[data-cy="clear-leaderboard-btn"]').click()
      cy.get('[data-cy="confirm-clear-btn"]').click()
      
      // 验证排行榜已清空
      cy.get('[data-cy="empty-leaderboard"]').should('be.visible')
      cy.get('[data-cy="leaderboard-entry"]').should('not.exist')
    })
  })

  describe('奖励系统测试', () => {
    it('应该为成就解锁提供奖励', () => {
      // 开始游戏
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 触发成就
      cy.gameAction('jump')
      
      // 验证奖励通知
      cy.get('[data-cy="reward-notification"]').should('be.visible')
      cy.get('[data-cy="reward-coins"]').should('be.visible')
      
      // 验证金币增加
      cy.window().its('gameStore').then((store) => {
        expect(store.coins).to.be.greaterThan(0)
      })
    })

    it('应该为排行榜记录提供奖励', () => {
      // 开始游戏并获得高分
      cy.startNewGame()
      cy.selectCharacter('default')
      
      cy.window().then((win) => {
        win.gameStore.score = 1000
        win.dispatchEvent(new CustomEvent('game-over'))
      })
      
      // 验证新记录奖励
      cy.get('[data-cy="new-record-bonus"]').should('be.visible')
    })
  })
})